components:
  schemas:
    Activity:
      additionalProperties: false
      description: An activity offered by the organisation, belonging to a department.
      properties:
        activityType:
          description: The type of the activity.
          type: string
        archived:
          description: Whether the activity has been archived.
          type: boolean
        archivedByUserId:
          anyOf:
            - exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            - type: 'null'
          description: The id of the user that archived the activity.
        archivedTimestamp:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The timestamp when the activity was archived (UTC), or null if the activity is not archived.
        code:
          anyOf:
            - type: string
            - type: 'null'
          description: The payroll code of the activity.
        department:
          additionalProperties: false
          description: The department that the activity belongs to.
          properties:
            id:
              description: The primary key that uniquely identifies the department.
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              description: The name of the department.
              type: string
          required:
            - id
            - name
          type: object
        emoji:
          anyOf:
            - type: string
            - type: 'null'
          description: The emoji associated with the activity.
        hexColor:
          description: The hex colour code for this activity, e.g. "54a0ff".
          type: string
        id:
          description: The primary key that uniquely identifies the activity in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        incomeCostCode:
          description: The income cost code for the activity.
          type: string
        name:
          description: The name of the activity.
          type: string
        rollMode:
          description: The default roll type of this activity.
          enum:
            - present
            - absent
          type: string
        smsCode:
          anyOf:
            - type: string
            - type: 'null'
          description: The SIS code of the activity.
        timesheetsEnabled:
          anyOf:
            - type: boolean
            - type: 'null'
          description: Whether timesheets are enabled for this activity.
      required:
        - id
        - name
        - code
        - emoji
        - archived
        - timesheetsEnabled
        - hexColor
        - smsCode
        - incomeCostCode
        - rollMode
        - activityType
        - archivedByUserId
        - archivedTimestamp
        - department
      type: object
    ActivitySelection:
      additionalProperties: false
      description: A student's selection of an activity for a season.
      properties:
        activity:
          additionalProperties: false
          properties:
            activityType:
              type: string
            code:
              anyOf:
                - type: string
                - type: 'null'
            description:
              anyOf:
                - type: string
                - type: 'null'
              description: The activity's description for the selected season; null when none is set.
            emoji:
              anyOf:
                - type: string
                - type: 'null'
            hexColor:
              type: string
            hexContrastColor:
              type: string
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              type: string
            smsCode:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - name
            - code
            - smsCode
            - description
            - activityType
            - emoji
            - hexColor
            - hexContrastColor
          type: object
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        invoice:
          additionalProperties: false
          properties:
            id:
              anyOf:
                - type: string
                - type: 'null'
            reference:
              anyOf:
                - type: string
                - type: 'null'
              description: Display reference, e.g. CB-000002.
            status:
              anyOf:
                - enum:
                    - unpaid
                    - paid
                    - partially-paid
                    - processing
                  type: string
                - type: 'null'
          required:
            - id
            - status
            - reference
          type: object
        onWaitlist:
          type: boolean
        season:
          additionalProperties: false
          properties:
            activitySelectionCloseTimestamp:
              anyOf:
                - description: ISO 8601 date-time in UTC (Z suffix).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                - type: 'null'
              description: When activity selection closes for the season (UTC), or null if not set.
            activitySelectionOpenTimestamp:
              anyOf:
                - description: ISO 8601 date-time in UTC (Z suffix).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                - type: 'null'
              description: When activity selection opens for the season (UTC), or null if not set.
            hidden:
              anyOf:
                - type: boolean
                - type: 'null'
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              type: string
          required:
            - id
            - name
            - hidden
            - activitySelectionOpenTimestamp
            - activitySelectionCloseTimestamp
          type: object
        seasonActivityOption:
          additionalProperties: false
          properties:
            id:
              anyOf:
                - type: string
                - type: 'null'
            label:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - label
          type: object
        selectedByGuardianId:
          anyOf:
            - exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            - type: 'null'
        selectedTimestamp:
          description: When the selection was made (UTC).
          example: '2025-06-19T10:30:00Z'
          format: date-time
          type: string
        student:
          additionalProperties: false
          properties:
            email:
              anyOf:
                - type: string
                - type: 'null'
            firstName:
              type: string
            gender:
              anyOf:
                - type: string
                - type: 'null'
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            lastName:
              type: string
            smsId:
              anyOf:
                - type: string
                - type: 'null'
            yearGroup:
              additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
          required:
            - id
            - smsId
            - firstName
            - lastName
            - email
            - gender
            - yearGroup
          type: object
      required:
        - id
        - selectedTimestamp
        - selectedByGuardianId
        - onWaitlist
        - activity
        - season
        - seasonActivityOption
        - student
        - invoice
      type: object
    AttendanceRecord:
      additionalProperties: false
      description: A student attendance record for a session roll.
      properties:
        absent:
          type: boolean
        addedToRoll:
          type: boolean
        attendanceFlags:
          items:
            additionalProperties: false
            properties:
              id:
                type: string
              name:
                type: string
            required:
              - id
              - name
            type: object
          type: array
        comment:
          anyOf:
            - type: string
            - type: 'null'
        explained:
          type: boolean
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        roll:
          additionalProperties: false
          properties:
            editedByUser:
              anyOf:
                - additionalProperties: false
                  properties:
                    firstName:
                      type: string
                    id:
                      exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    lastName:
                      type: string
                    sisId:
                      anyOf:
                        - type: string
                        - type: 'null'
                  required:
                    - id
                    - firstName
                    - lastName
                    - sisId
                  type: object
                - type: 'null'
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            markedByUser:
              anyOf:
                - additionalProperties: false
                  properties:
                    firstName:
                      type: string
                    id:
                      exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    lastName:
                      type: string
                    sisId:
                      anyOf:
                        - type: string
                        - type: 'null'
                  required:
                    - id
                    - firstName
                    - lastName
                    - sisId
                  type: object
                - type: 'null'
            timeEdited:
              anyOf:
                - description: ISO 8601 date-time in UTC (Z suffix).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                - type: 'null'
              description: The date-time the roll was last edited (UTC), or null if the roll has not been edited.
            timeMarked:
              anyOf:
                - description: ISO 8601 date-time in UTC (Z suffix).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                - type: 'null'
              description: The date-time the roll was marked (UTC), or null if the roll has not been marked.
          required:
            - id
            - timeMarked
            - timeEdited
            - markedByUser
            - editedByUser
          type: object
        session:
          additionalProperties: false
          properties:
            activity:
              additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            endDateTime:
              anyOf:
                - description: ISO 8601 date-time in UTC (Z suffix).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                - type: 'null'
              description: The date-time the session ends (UTC), or null if the session has no end time.
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            startDateTime:
              description: The date-time the session starts (UTC).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            title:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - title
            - activity
            - startDateTime
            - endDateTime
          type: object
        student:
          additionalProperties: false
          properties:
            firstName:
              type: string
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            lastName:
              type: string
            legalFirstName:
              anyOf:
                - type: string
                - type: 'null'
            smsId:
              anyOf:
                - type: string
                - type: 'null'
            yearGroup:
              additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
          required:
            - id
            - firstName
            - legalFirstName
            - lastName
            - smsId
            - yearGroup
          type: object
        team:
          anyOf:
            - additionalProperties: false
              properties:
                category:
                  anyOf:
                    - additionalProperties: false
                      properties:
                        id:
                          exclusiveMinimum: 0
                          maximum: 9007199254740991
                          type: integer
                        name:
                          type: string
                      required:
                        - id
                        - name
                      type: object
                    - type: 'null'
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
                sisId:
                  anyOf:
                    - type: string
                    - type: 'null'
              required:
                - id
                - name
                - category
                - sisId
              type: object
            - type: 'null'
        updatedByUser:
          anyOf:
            - additionalProperties: false
              properties:
                firstName:
                  type: string
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                lastName:
                  type: string
                sisId:
                  anyOf:
                    - type: string
                    - type: 'null'
              required:
                - id
                - firstName
                - lastName
                - sisId
              type: object
            - type: 'null'
        updatedTimestamp:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The date-time the attendance record was last updated (UTC), or null if it has not been updated.
      required:
        - id
        - absent
        - explained
        - comment
        - addedToRoll
        - attendanceFlags
        - student
        - session
        - team
        - roll
        - updatedTimestamp
        - updatedByUser
      type: object
    Department:
      additionalProperties: false
      description: An overarching category that activities fall under, e.g. Music, Co-Curricular or Sport.
      properties:
        id:
          description: The primary key that uniquely identifies the department in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        name:
          description: The department's name.
          type: string
      required:
        - id
        - name
      type: object
    Error:
      additionalProperties: false
      properties:
        error:
          description: Human-readable error message.
          type: string
      required:
        - error
      type: object
    GetActivitiesResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/Activity'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetActivitySelectionsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/ActivitySelection'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetAttendanceRecordsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/AttendanceRecord'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetDepartmentsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/Department'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetIncidentsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/Incident'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetLocationsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/Location'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
      required:
        - data
        - pagination
      type: object
    GetPreExplainedAbsencesResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/PreExplainedAbsence'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
      required:
        - data
        - pagination
      type: object
    GetSessionByIdResponse:
      additionalProperties: false
      properties:
        customFieldsMetadata:
          additionalProperties:
            additionalProperties: false
            properties:
              dataType:
                enum:
                  - short-text
                  - time
                  - single-select
                  - staff
                  - student
                type: string
              label:
                type: string
              showAfterField:
                type: string
              showToUserTypes:
                items:
                  enum:
                    - admin
                    - manager
                    - staff
                    - guardian
                    - student
                  type: string
                type: array
            required:
              - label
              - dataType
              - showAfterField
              - showToUserTypes
            type: object
          propertyNames:
            type: string
          type: object
        data:
          $ref: '#/components/schemas/Session'
      required:
        - data
      type: object
    GetSessionsResponse:
      additionalProperties: false
      properties:
        customFieldsMetadata:
          additionalProperties:
            additionalProperties: false
            properties:
              dataType:
                enum:
                  - short-text
                  - time
                  - single-select
                  - staff
                  - student
                type: string
              label:
                type: string
              showAfterField:
                type: string
              showToUserTypes:
                items:
                  enum:
                    - admin
                    - manager
                    - staff
                    - guardian
                    - student
                  type: string
                type: array
            required:
              - label
              - dataType
              - showAfterField
              - showToUserTypes
            type: object
          propertyNames:
            type: string
          type: object
        data:
          items:
            $ref: '#/components/schemas/SessionListItem'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetStudentTeamsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/StudentTeam'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetStudentsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/Student'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
      required:
        - data
        - pagination
      type: object
    GetTeamByIdResponse:
      additionalProperties: false
      properties:
        data:
          $ref: '#/components/schemas/Team'
      required:
        - data
      type: object
    GetTeamsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/TeamListItem'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetUsersResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/User'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
        paginationData:
          $ref: '#/components/schemas/Pagination'
          deprecated: true
          description: Deprecated duplicate of pagination.
      required:
        - data
        - pagination
        - paginationData
      type: object
    GetYearGroupsResponse:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/YearGroup'
          type: array
        pagination:
          $ref: '#/components/schemas/Pagination'
      required:
        - data
        - pagination
      type: object
    Incident:
      additionalProperties: false
      description: An incident report for a student.
      properties:
        activity:
          additionalProperties: false
          properties:
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              type: string
          required:
            - id
            - name
          type: object
        archived:
          type: boolean
        concussionStatus:
          enum:
            - confirmed
            - potential
            - none
          type: string
        dateTime:
          description: The date-time the incident occurred (UTC).
          example: '2025-06-19T10:30:00Z'
          format: date-time
          type: string
        fields:
          anyOf:
            - additionalProperties: {}
              description: Custom incident-report field values, keyed by field label. Each value is typically an object carrying a `fieldType` (one of `text`, `date`, `time`, `body-chart`, `concussion-check`, `photo`, `dropdown` or `additional-field-dropdown`), usually a `label` and a display-ready `formattedValue` (the string most integrations will want), and a type-dependent `value`; dropdown fields also carry a `multiselect` flag. The exact shape depends on the field type and is not guaranteed for every incident.
              example:
                Body parts affected:
                  fieldType: dropdown
                  formattedValue: Left ankle, Left knee
                  label: Body parts affected
                  multiselect: true
                  value:
                    - Left ankle
                    - Left knee
                Description:
                  fieldType: text
                  formattedValue: Twisted ankle during warm-up
                  label: Description
                  value: Twisted ankle during warm-up
              propertyNames:
                type: string
              type: object
            - type: 'null'
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        location:
          type: string
        returnToPlay:
          anyOf:
            - additionalProperties: false
              properties:
                date:
                  description: The date-time the student was cleared to return to play (UTC).
                  example: '2025-06-19T10:30:00Z'
                  format: date-time
                  type: string
                reason:
                  anyOf:
                    - type: string
                    - type: 'null'
              required:
                - date
                - reason
              type: object
            - type: 'null'
        shift:
          additionalProperties: false
          properties:
            id:
              anyOf:
                - exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                - type: 'null'
            title:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - title
          type: object
        staffMember:
          additionalProperties: false
          properties:
            firstName:
              anyOf:
                - type: string
                - type: 'null'
            id:
              anyOf:
                - exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                - type: 'null'
            lastName:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - firstName
            - lastName
          type: object
        studentConcerned:
          additionalProperties: false
          properties:
            firstName:
              anyOf:
                - type: string
                - type: 'null'
            id:
              anyOf:
                - exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                - type: 'null'
            lastName:
              anyOf:
                - type: string
                - type: 'null'
            legalFirstName:
              anyOf:
                - type: string
                - type: 'null'
            smsId:
              anyOf:
                - type: string
                - type: 'null'
            yearGroup:
              additionalProperties: false
              properties:
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                name:
                  anyOf:
                    - type: string
                    - type: 'null'
              required:
                - id
                - name
              type: object
          required:
            - id
            - firstName
            - legalFirstName
            - lastName
            - smsId
            - yearGroup
          type: object
        template:
          additionalProperties: false
          properties:
            field:
              anyOf:
                - items: {}
                  type: array
                - type: 'null'
              description: The template field definitions this incident was recorded against, or null. Each element is typically an object describing a configured field — its `label`, `fieldType`, and any options set by the organisation (for example dropdown `options`, or `required` and `multiselect` flags). The exact shape is not guaranteed.
              example:
                - fieldType: dropdown
                  label: Body parts affected
                  multiselect: true
                  options:
                    - Left ankle
                    - Left knee
                    - Head
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
          required:
            - id
            - field
          type: object
      required:
        - id
        - location
        - studentConcerned
        - fields
        - dateTime
        - concussionStatus
        - returnToPlay
        - activity
        - template
        - shift
        - staffMember
        - archived
      type: object
    Location:
      additionalProperties: false
      description: A place or venue at which a session or fixture can be held.
      properties:
        address:
          anyOf:
            - type: string
            - type: 'null'
          description: The address of the location, if any.
        archived:
          description: Whether the location has been archived (true) or is still active (false).
          type: boolean
        id:
          description: The primary key that uniquely identifies the location in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        latitude:
          anyOf:
            - type: number
            - type: 'null'
          description: The latitude coordinate of the location, if known.
        longitude:
          anyOf:
            - type: number
            - type: 'null'
          description: The longitude coordinate of the location, if known.
        name:
          description: The name of the location.
          type: string
      required:
        - id
        - name
        - address
        - latitude
        - longitude
        - archived
      type: object
    Pagination:
      additionalProperties: false
      properties:
        currentPage:
          description: The page of results returned (1-indexed).
          maximum: 9007199254740991
          minimum: 1
          type: integer
        lastPage:
          description: The total number of pages for the query. Zero when the query matched no records.
          maximum: 9007199254740991
          minimum: 0
          type: integer
        numRecords:
          description: The total number of records matching the query.
          maximum: 9007199254740991
          minimum: 0
          type: integer
        pageLength:
          description: The number of records per page, as requested.
          maximum: 9007199254740991
          minimum: 1
          type: integer
      required:
        - currentPage
        - lastPage
        - numRecords
        - pageLength
      type: object
    PreExplainedAbsence:
      additionalProperties: false
      description: A planned (pre-explained) student absence.
      properties:
        endDate:
          description: End of the absence (inclusive), with no timezone designator, in the format YYYY-MM-DD HH:MM:SS. Absences are stored as ending at the last millisecond of the day, so this usually carries a fractional second.
          example: '2025-06-19 10:30:00'
          type: string
        explained:
          type: boolean
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        reason:
          maxLength: 4096
          type: string
        startDate:
          description: Start of the absence (inclusive), with no timezone designator, in the format YYYY-MM-DD HH:MM:SS.
          example: '2025-06-19 10:30:00'
          type: string
        studentId:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
      required:
        - id
        - studentId
        - startDate
        - endDate
        - explained
        - reason
      type: object
    Session:
      additionalProperties: false
      description: A Session is a calendar event, which could be anything from a music lesson to a sports match. A Session that has a result associated with it (such as a sports match) is referred to as a Fixture.
      properties:
        activity:
          additionalProperties: false
          description: The activity this Session belongs to.
          properties:
            department:
              additionalProperties: false
              description: The department that the activity belongs to.
              properties:
                id:
                  description: The primary key that uniquely identifies the department.
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  description: The name of the department.
                  type: string
              required:
                - id
                - name
              type: object
            hexColor:
              description: The hex colour code for this activity, e.g. "54a0ff".
              type: string
            id:
              description: The primary key that uniquely identifies the activity in Clipboard.
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              description: The name of the activity.
              type: string
          required:
            - id
            - name
            - hexColor
            - department
          type: object
        assignedStaff:
          description: The staff assigned to the Session. Only returned when `includeStaff` is true.
          items:
            additionalProperties: false
            properties:
              externalId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: The staff member's primary external identifier, as set by the school or synced from their student information system. Null when no external identifier has been recorded. Mutually exclusive with sisId on write; on read, a non-null sisId indicates a legacy record that has not yet been migrated.
              firstName:
                description: The first name of the staff member.
                type: string
              id:
                description: The Clipboard user id of the staff member.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                description: The last name of the staff member.
                type: string
              secondaryExternalId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: A secondary external identifier for the staff member, used when the school's systems assign more than one identifier per person. Null when not recorded.
              sisId:
                anyOf:
                  - type: string
                  - type: 'null'
                deprecated: true
                description: 'Deprecated: use externalId / secondaryExternalId instead.'
            required:
              - id
              - firstName
              - lastName
              - sisId
              - externalId
              - secondaryExternalId
            type: object
          type: array
        bye:
          anyOf:
            - type: boolean
            - type: 'null'
          description: Whether the Fixture is a bye.
        cancelled:
          anyOf:
            - type: boolean
            - type: 'null'
          description: Whether the Session is cancelled.
        creatorUserId:
          anyOf:
            - exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            - type: 'null'
          description: The Clipboard id of the User who created the Session. Null for Fixtures that originated via Clipboard Compete.
        customFieldsData:
          additionalProperties:
            anyOf:
              - type: string
              - items:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                type: array
          description: The custom field values recorded against the Session, keyed by custom field identifier. Session-level identifiers are prefixed with `sessions_` and team-level identifiers with `teams_`. Values are strings, except student-typed fields, which are arrays of student ids. Request `includeCustomFieldsMetadata` for the definition of each custom field.
          propertyNames:
            type: string
          type: object
        displayScore:
          description: The score formatted for display, or an empty string when there is no score to format.
          type: string
        endDateTime:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The end timestamp of the Session, if any. Byes have no endDateTime.
        id:
          description: The primary key that uniquely identifies the Session in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        locationData:
          anyOf:
            - additionalProperties: false
              properties:
                address:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: The location's address.
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the location in Clipboard, or null for older Sessions that only recorded a location name.
                latitude:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The latitude of the location.
                longitude:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The longitude of the location.
                name:
                  description: The name of the Session's location.
                  type: string
                owner:
                  anyOf:
                    - additionalProperties: false
                      properties:
                        acronym:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The acronym stored for the owner school, if any.
                        id:
                          description: The primary key that uniquely identifies the owner school in Clipboard.
                          exclusiveMinimum: 0
                          maximum: 9007199254740991
                          type: integer
                        name:
                          description: The full name of the owner school.
                          type: string
                        shortName:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The shortened name stored for the owner school, if any.
                        state:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The state the owner school is situated in, or null when its address has no state set.
                      required:
                        - id
                        - name
                        - acronym
                        - shortName
                        - state
                      type: object
                    - type: 'null'
                  description: The school that owns the location, if any. Useful for telling apart two schools with a location of the same name.
                subLocations:
                  anyOf:
                    - items:
                        additionalProperties: false
                        properties:
                          address:
                            anyOf:
                              - type: string
                              - type: 'null'
                            description: The sub-location's address.
                          id:
                            description: The primary key that uniquely identifies the sub-location in Clipboard.
                            exclusiveMinimum: 0
                            maximum: 9007199254740991
                            type: integer
                          latitude:
                            anyOf:
                              - type: number
                              - type: 'null'
                            description: The latitude of the sub-location.
                          longitude:
                            anyOf:
                              - type: number
                              - type: 'null'
                            description: The longitude of the sub-location.
                          name:
                            description: The name of the sub-location.
                            type: string
                          owner:
                            anyOf:
                              - additionalProperties: false
                                properties:
                                  acronym:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The acronym stored for the owner school, if any.
                                  id:
                                    description: The primary key that uniquely identifies the owner school in Clipboard.
                                    exclusiveMinimum: 0
                                    maximum: 9007199254740991
                                    type: integer
                                  name:
                                    description: The full name of the owner school.
                                    type: string
                                  shortName:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The shortened name stored for the owner school, if any.
                                  state:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The state the owner school is situated in, or null when its address has no state set.
                                required:
                                  - id
                                  - name
                                  - acronym
                                  - shortName
                                  - state
                                type: object
                              - type: 'null'
                            description: The school that owns the sub-location, if any.
                        required:
                          - id
                          - name
                          - address
                          - latitude
                          - longitude
                          - owner
                        type: object
                      type: array
                    - type: 'null'
                  description: The sub-locations of the location, if any, such as the fields or courts within a larger venue.
              required:
                - id
                - name
                - address
                - latitude
                - longitude
                - owner
                - subLocations
              type: object
            - type: 'null'
          description: Details about the location of the Session, if any.
        notes:
          description: Notes for the Session's staff members, usually set by whoever created the Session.
          type: string
        opponent:
          anyOf:
            - type: string
            - type: 'null'
          description: The name of the opponent school and team, if any. Only applies to Fixtures.
        opponentOrganisation:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the opponent school in Clipboard, or null when the opponent school was entered as free text.
                name:
                  description: The name of the Fixture's opponent school.
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
          description: Details about the opponent school of the Fixture, if any. Only applies to Fixtures.
        opponentScore:
          anyOf:
            - type: string
            - type: 'null'
          description: The score for the opponent. Only applies to Fixtures.
        opponentTeam:
          anyOf:
            - additionalProperties: false
              properties:
                activityName:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: The name of the Activity the opponent Team is categorised within, if any.
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the opponent Team in Clipboard, or null when the opponent Team was entered as free text.
                name:
                  description: The name of the Fixture's opponent Team.
                  type: string
              required:
                - id
                - name
                - activityName
              type: object
            - type: 'null'
          description: Details about the opponent Team of the Fixture, if any. Only applies to Fixtures.
        optional:
          description: Whether the Session is optional for the students and Teams assigned to it.
          type: boolean
        organisationScore:
          anyOf:
            - type: string
            - type: 'null'
          description: The score for the school. Only applies to Fixtures.
        result:
          anyOf:
            - type: string
            - type: 'null'
          description: The end result for the Session, for example `W`, `L`, `D`, `F`, `OF`, `NR` or `WO`. Only applies to Fixtures.
        resultNotes:
          anyOf:
            - type: string
            - type: 'null'
          description: The notes recorded alongside the result, if any. Only applies to Fixtures.
        roundName:
          anyOf:
            - type: string
            - type: 'null'
          description: The round name of the Fixture, if any, which groups multiple Fixtures together.
        scored:
          description: Whether the Session is a Fixture, and so should have a result recorded for it.
          type: boolean
        startDateTime:
          description: The start timestamp of the Session.
          example: '2025-06-19T10:30:00Z'
          format: date-time
          type: string
        status:
          description: The status of the Session.
          enum:
            - confirmed
            - unconfirmed
            - draft
          type: string
        studentParentNotes:
          description: Notes for the Session's students and their parents or guardians.
          type: string
        students:
          description: 'Returned when `includeTeams` is true, but always empty: this endpoint does not resolve the students assigned to a Session. Use the Sessions list endpoint to read them.'
          items:
            additionalProperties: false
            properties:
              firstName:
                description: The student's first name.
                type: string
              id:
                description: The Clipboard id of the student.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                description: The student's last name.
                type: string
              smsId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: The student's identifier in the school's student management system, if any.
              yearGroup:
                additionalProperties: false
                description: The student's current year group.
                properties:
                  id:
                    description: The Clipboard id of the year group.
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  name:
                    description: The name of the year group.
                    type: string
                required:
                  - id
                  - name
                type: object
            required:
              - id
              - firstName
              - lastName
              - smsId
              - yearGroup
            type: object
          type: array
        teams:
          description: The Teams assigned to the Session. Only returned when `includeTeams` is true.
          items:
            additionalProperties: false
            properties:
              category:
                anyOf:
                  - additionalProperties: false
                    properties:
                      id:
                        description: The Clipboard id of the category.
                        exclusiveMinimum: 0
                        maximum: 9007199254740991
                        type: integer
                      name:
                        description: The category's name.
                        type: string
                      sortOrder:
                        anyOf:
                          - maximum: 9007199254740991
                            minimum: -9007199254740991
                            type: integer
                          - type: 'null'
                        description: The category's sort order.
                    required:
                      - id
                      - name
                      - sortOrder
                    type: object
                  - type: 'null'
                description: The category the Team is in, if any.
              customFieldsData:
                additionalProperties:
                  anyOf:
                    - type: string
                    - items:
                        additionalProperties: false
                        properties:
                          email:
                            description: The email address of the referenced staff member.
                            type: string
                          firstName:
                            description: The first name of the referenced staff member.
                            type: string
                          lastName:
                            description: The last name of the referenced staff member.
                            type: string
                        required:
                          - firstName
                          - lastName
                          - email
                        type: object
                      type: array
                description: The custom field values recorded against the Team, keyed by custom field identifier. A staff-typed field's value is the referenced staff members' details; every other value is a string.
                propertyNames:
                  type: string
                type: object
              id:
                description: The Clipboard id of the Team.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              name:
                description: The Team name.
                type: string
              subcategory:
                anyOf:
                  - additionalProperties: false
                    properties:
                      id:
                        description: The Clipboard id of the subcategory.
                        exclusiveMinimum: 0
                        maximum: 9007199254740991
                        type: integer
                      name:
                        description: The subcategory's name.
                        type: string
                    required:
                      - id
                      - name
                    type: object
                  - type: 'null'
                description: The subcategory the Team is in, if any.
            required:
              - id
              - name
              - category
              - subcategory
            type: object
          type: array
        title:
          description: What the Session is called.
          type: string
      required:
        - id
        - title
        - locationData
        - notes
        - studentParentNotes
        - scored
        - opponent
        - opponentTeam
        - opponentOrganisation
        - bye
        - cancelled
        - startDateTime
        - endDateTime
        - creatorUserId
        - organisationScore
        - opponentScore
        - displayScore
        - result
        - resultNotes
        - activity
        - status
        - optional
        - roundName
      type: object
    SessionListItem:
      additionalProperties: false
      description: A Session as returned by the Sessions list endpoint. A Session is a calendar event, which could be anything from a music lesson to a sports match. A Session that has a result associated with it (such as a sports match) is referred to as a Fixture.
      properties:
        activity:
          additionalProperties: false
          description: The activity this Session belongs to.
          properties:
            department:
              additionalProperties: false
              description: The department that the activity belongs to.
              properties:
                id:
                  description: The primary key that uniquely identifies the department.
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  description: The name of the department.
                  type: string
              required:
                - id
                - name
              type: object
            hexColor:
              description: The hex colour code for this activity, e.g. "54a0ff".
              type: string
            id:
              description: The primary key that uniquely identifies the activity in Clipboard.
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              description: The name of the activity.
              type: string
          required:
            - id
            - name
            - hexColor
            - department
          type: object
        assignedStaff:
          description: The staff assigned to the Session. Only returned when `includeStaff` is true.
          items:
            additionalProperties: false
            properties:
              externalId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: The staff member's primary external identifier, as set by the school or synced from their student information system. Null when no external identifier has been recorded. Mutually exclusive with sisId on write; on read, a non-null sisId indicates a legacy record that has not yet been migrated.
              firstName:
                description: The first name of the staff member.
                type: string
              id:
                description: The Clipboard user id of the staff member.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                description: The last name of the staff member.
                type: string
              secondaryExternalId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: A secondary external identifier for the staff member, used when the school's systems assign more than one identifier per person. Null when not recorded.
              sisId:
                anyOf:
                  - type: string
                  - type: 'null'
                deprecated: true
                description: 'Deprecated: use externalId / secondaryExternalId instead.'
            required:
              - id
              - firstName
              - lastName
              - sisId
              - externalId
              - secondaryExternalId
            type: object
          type: array
        bye:
          anyOf:
            - type: boolean
            - type: 'null'
          description: Whether the Fixture is a bye.
        cancelled:
          anyOf:
            - type: boolean
            - type: 'null'
          description: Whether the Session is cancelled.
        creatorUserId:
          anyOf:
            - exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            - type: 'null'
          description: The Clipboard id of the User who created the Session. Null for Fixtures that originated via Clipboard Compete.
        customFieldsData:
          additionalProperties:
            anyOf:
              - type: string
              - items:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                type: array
          description: The custom field values recorded against the Session, keyed by custom field identifier. Session-level identifiers are prefixed with `sessions_` and team-level identifiers with `teams_`. Values are strings, except student-typed fields, which are arrays of student ids. Request `includeCustomFieldsMetadata` for the definition of each custom field.
          propertyNames:
            type: string
          type: object
        displayScore:
          description: The score formatted for display, or an empty string when there is no score to format.
          type: string
        endDateTime:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The end timestamp of the Session, if any. Byes have no endDateTime.
        feedback:
          description: The feedback staff have left on the Session.
          items:
            additionalProperties: false
            properties:
              feedback:
                description: The feedback provided by the staff member.
                type: string
              id:
                description: The Clipboard id of this piece of feedback.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              user:
                additionalProperties: false
                description: The staff member who left this feedback.
                properties:
                  firstName:
                    description: The first name of the staff member who left this feedback.
                    type: string
                  id:
                    description: The Clipboard user id of the staff member.
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  lastName:
                    description: The last name of the staff member who left this feedback.
                    type: string
                required:
                  - id
                  - firstName
                  - lastName
                type: object
            required:
              - id
              - feedback
              - user
            type: object
          type: array
        id:
          description: The primary key that uniquely identifies the Session in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        location:
          deprecated: true
          description: Deprecated. The location name, or an empty string; use locationData.
          type: string
        locationData:
          anyOf:
            - additionalProperties: false
              properties:
                address:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: The location's address.
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the location in Clipboard, or null for older Sessions that only recorded a location name.
                latitude:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The latitude of the location.
                longitude:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The longitude of the location.
                name:
                  description: The name of the Session's location.
                  type: string
                owner:
                  anyOf:
                    - additionalProperties: false
                      properties:
                        acronym:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The acronym stored for the owner school, if any.
                        id:
                          description: The primary key that uniquely identifies the owner school in Clipboard.
                          exclusiveMinimum: 0
                          maximum: 9007199254740991
                          type: integer
                        name:
                          description: The full name of the owner school.
                          type: string
                        shortName:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The shortened name stored for the owner school, if any.
                        state:
                          anyOf:
                            - type: string
                            - type: 'null'
                          description: The state the owner school is situated in, or null when its address has no state set.
                      required:
                        - id
                        - name
                        - acronym
                        - shortName
                        - state
                      type: object
                    - type: 'null'
                  description: The school that owns the location, if any. Useful for telling apart two schools with a location of the same name.
                subLocations:
                  anyOf:
                    - items:
                        additionalProperties: false
                        properties:
                          address:
                            anyOf:
                              - type: string
                              - type: 'null'
                            description: The sub-location's address.
                          id:
                            description: The primary key that uniquely identifies the sub-location in Clipboard.
                            exclusiveMinimum: 0
                            maximum: 9007199254740991
                            type: integer
                          latitude:
                            anyOf:
                              - type: number
                              - type: 'null'
                            description: The latitude of the sub-location.
                          longitude:
                            anyOf:
                              - type: number
                              - type: 'null'
                            description: The longitude of the sub-location.
                          name:
                            description: The name of the sub-location.
                            type: string
                          owner:
                            anyOf:
                              - additionalProperties: false
                                properties:
                                  acronym:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The acronym stored for the owner school, if any.
                                  id:
                                    description: The primary key that uniquely identifies the owner school in Clipboard.
                                    exclusiveMinimum: 0
                                    maximum: 9007199254740991
                                    type: integer
                                  name:
                                    description: The full name of the owner school.
                                    type: string
                                  shortName:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The shortened name stored for the owner school, if any.
                                  state:
                                    anyOf:
                                      - type: string
                                      - type: 'null'
                                    description: The state the owner school is situated in, or null when its address has no state set.
                                required:
                                  - id
                                  - name
                                  - acronym
                                  - shortName
                                  - state
                                type: object
                              - type: 'null'
                            description: The school that owns the sub-location, if any.
                        required:
                          - id
                          - name
                          - address
                          - latitude
                          - longitude
                          - owner
                        type: object
                      type: array
                    - type: 'null'
                  description: The sub-locations of the location, if any, such as the fields or courts within a larger venue.
              required:
                - id
                - name
                - address
                - latitude
                - longitude
                - owner
                - subLocations
              type: object
            - type: 'null'
          description: Details about the location of the Session, if any.
        notes:
          description: Notes for the Session's staff members, usually set by whoever created the Session.
          type: string
        opponent:
          anyOf:
            - type: string
            - type: 'null'
          description: The name of the opponent school and team, if any. Only applies to Fixtures.
        opponentOrganisation:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the opponent school in Clipboard, or null when the opponent school was entered as free text.
                name:
                  description: The name of the Fixture's opponent school.
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
          description: Details about the opponent school of the Fixture, if any. Only applies to Fixtures.
        opponentScore:
          anyOf:
            - type: string
            - type: 'null'
          description: The score for the opponent. Only applies to Fixtures.
        opponentTeam:
          anyOf:
            - additionalProperties: false
              properties:
                activityName:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: The name of the Activity the opponent Team is categorised within, if any.
                id:
                  anyOf:
                    - exclusiveMinimum: 0
                      maximum: 9007199254740991
                      type: integer
                    - type: 'null'
                  description: The primary key that uniquely identifies the opponent Team in Clipboard, or null when the opponent Team was entered as free text.
                name:
                  description: The name of the Fixture's opponent Team.
                  type: string
              required:
                - id
                - name
                - activityName
              type: object
            - type: 'null'
          description: Details about the opponent Team of the Fixture, if any. Only applies to Fixtures.
        optional:
          description: Whether the Session is optional for the students and Teams assigned to it.
          type: boolean
        organisationScore:
          anyOf:
            - type: string
            - type: 'null'
          description: The score for the school. Only applies to Fixtures.
        recordedResult:
          anyOf:
            - additionalProperties: false
              properties:
                opponentValue:
                  type: string
                type:
                  enum:
                    - W
                    - L
                    - D
                    - F
                    - OF
                    - NR
                    - T
                    - IP
                    - WO
                  type: string
                value:
                  type: string
              required:
                - type
                - value
                - opponentValue
              type: object
            - type: 'null'
        remindStaff:
          description: Whether the assigned staff were, or will be, reminded of the Session by SMS and email on the day before it.
          type: boolean
        result:
          anyOf:
            - type: string
            - type: 'null'
          description: The end result for the Session, for example `W`, `L`, `D`, `F`, `OF`, `NR` or `WO`. Only applies to Fixtures.
        resultNotes:
          anyOf:
            - type: string
            - type: 'null'
          description: The notes recorded alongside the result, if any. Only applies to Fixtures.
        roundName:
          anyOf:
            - type: string
            - type: 'null'
          description: The round name of the Fixture, which groups multiple Fixtures together. Only returned when `includeRoundName` is true.
        score:
          anyOf:
            - additionalProperties: false
              properties:
                against:
                  additionalProperties:
                    anyOf:
                      - type: number
                      - type: string
                      - type: 'null'
                  propertyNames:
                    type: string
                  type: object
                for:
                  additionalProperties:
                    anyOf:
                      - type: number
                      - type: string
                      - type: 'null'
                  propertyNames:
                    type: string
                  type: object
              required:
                - for
                - against
              type: object
            - type: 'null'
        scoreTemplateId:
          anyOf:
            - type: string
            - type: 'null'
        scored:
          description: Whether the Session is a Fixture, and so should have a result recorded for it.
          type: boolean
        sisIds:
          description: The matching student SIS ids, when requested with includeSisIds.
          items:
            type: string
          type: array
        startDateTime:
          description: The start timestamp of the Session.
          example: '2025-06-19T10:30:00Z'
          format: date-time
          type: string
        status:
          description: The status of the Session.
          enum:
            - confirmed
            - unconfirmed
            - draft
          type: string
        studentParentNotes:
          description: Notes for the Session's students and their parents or guardians.
          type: string
        students:
          description: The students assigned to the Session individually rather than through a Team; a Session has either Teams or students, never both. Only returned when `includeTeams` is true.
          items:
            additionalProperties: false
            properties:
              firstName:
                description: The student's first name.
                type: string
              id:
                description: The Clipboard id of the student.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                description: The student's last name.
                type: string
              smsId:
                anyOf:
                  - type: string
                  - type: 'null'
                description: The student's identifier in the school's student management system, if any.
              yearGroup:
                additionalProperties: false
                description: The student's current year group.
                properties:
                  id:
                    description: The Clipboard id of the year group.
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  name:
                    description: The name of the year group.
                    type: string
                required:
                  - id
                  - name
                type: object
            required:
              - id
              - firstName
              - lastName
              - smsId
              - yearGroup
            type: object
          type: array
        teams:
          description: The Teams assigned to the Session. Only returned when `includeTeams` is true.
          items:
            additionalProperties: false
            properties:
              category:
                anyOf:
                  - additionalProperties: false
                    properties:
                      id:
                        description: The Clipboard id of the category.
                        exclusiveMinimum: 0
                        maximum: 9007199254740991
                        type: integer
                      name:
                        description: The category's name.
                        type: string
                      sortOrder:
                        anyOf:
                          - maximum: 9007199254740991
                            minimum: -9007199254740991
                            type: integer
                          - type: 'null'
                        description: The category's sort order.
                    required:
                      - id
                      - name
                      - sortOrder
                    type: object
                  - type: 'null'
                description: The category the Team is in, if any.
              id:
                description: The Clipboard id of the Team.
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              name:
                description: The Team name.
                type: string
              sortOrder:
                anyOf:
                  - maximum: 9007199254740991
                    minimum: -9007199254740991
                    type: integer
                  - type: 'null'
                description: The Team's sort order.
              subcategory:
                anyOf:
                  - additionalProperties: false
                    properties:
                      id:
                        description: The Clipboard id of the subcategory.
                        exclusiveMinimum: 0
                        maximum: 9007199254740991
                        type: integer
                      name:
                        description: The subcategory's name.
                        type: string
                    required:
                      - id
                      - name
                    type: object
                  - type: 'null'
                description: The subcategory the Team is in, if any.
            required:
              - id
              - name
              - category
              - subcategory
              - sortOrder
            type: object
          type: array
        title:
          description: What the Session is called.
          type: string
        updatedTimestamp:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The timestamp the Session was last updated, if it has been updated.
      required:
        - id
        - title
        - locationData
        - notes
        - studentParentNotes
        - scored
        - opponent
        - opponentTeam
        - opponentOrganisation
        - bye
        - cancelled
        - startDateTime
        - endDateTime
        - creatorUserId
        - organisationScore
        - opponentScore
        - displayScore
        - result
        - resultNotes
        - activity
        - status
        - optional
        - location
        - updatedTimestamp
        - score
        - scoreTemplateId
        - recordedResult
        - remindStaff
        - feedback
        - customFieldsData
      type: object
    SessionsCalendar:
      description: An iCalendar (RFC 5545) VCALENDAR document with one VEVENT per Session, served as an attachment named cal.ics.
      type: string
    Student:
      additionalProperties: false
      description: A student enrolled at the school.
      properties:
        firstName:
          type: string
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        lastName:
          type: string
        legalFirstName:
          anyOf:
            - type: string
            - type: 'null'
        secondarySisId:
          anyOf:
            - type: string
            - type: 'null'
        sisId:
          anyOf:
            - type: string
            - type: 'null'
        yearGroupId:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
      required:
        - id
        - firstName
        - lastName
        - legalFirstName
        - sisId
        - secondarySisId
        - yearGroupId
      type: object
    StudentTeam:
      additionalProperties: false
      description: A student's membership of a team.
      properties:
        endDateTime:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The date-time the student left the team (null for students still in the team).
        id:
          description: The primary key that uniquely identifies the student team in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        startDateTime:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The date-time the student joined the team (null for older student teams).
        student:
          additionalProperties: false
          description: The student of the student team pairing.
          properties:
            fullName:
              description: The full name of the student.
              type: string
            id:
              description: The primary key that uniquely identifies the student in Clipboard.
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            smsId:
              anyOf:
                - type: string
                - type: 'null'
              description: The id of the student in the school's Student Information System.
          required:
            - id
            - fullName
            - smsId
          type: object
        team:
          additionalProperties: false
          description: The team of the student team pairing.
          properties:
            activity:
              additionalProperties: false
              description: The activity the team belongs to.
              properties:
                id:
                  description: The primary key that uniquely identifies the activity in Clipboard.
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  description: The name of the activity.
                  type: string
              required:
                - id
                - name
              type: object
            id:
              description: The primary key that uniquely identifies the team in Clipboard.
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              description: The name of the team.
              type: string
            sisId:
              anyOf:
                - type: string
                - type: 'null'
              description: The team's SIS id.
          required:
            - id
            - name
            - sisId
            - activity
          type: object
      required:
        - id
        - student
        - team
        - startDateTime
        - endDateTime
      type: object
    Team:
      additionalProperties: false
      description: A team, ensemble or group of students.
      properties:
        activity:
          additionalProperties: false
          properties:
            department:
              additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              type: string
            sisCode:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - name
            - sisCode
            - department
          type: object
        ageGroup:
          additionalProperties: false
          description: Deprecated duplicate of the top-level category, retained for backwards compatibility.
          properties:
            id:
              anyOf:
                - exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                - type: 'null'
            name:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - name
          type: object
        assignedStaff:
          items:
            additionalProperties: false
            properties:
              firstName:
                type: string
              id:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                type: string
              sisId:
                anyOf:
                  - type: string
                  - type: 'null'
            required:
              - id
              - firstName
              - lastName
              - sisId
            type: object
          type: array
        category:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
        hidden:
          type: boolean
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        name:
          type: string
        positions:
          items:
            additionalProperties: false
            properties:
              id:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              name:
                type: string
              numberOfSlots:
                anyOf:
                  - maximum: 9007199254740991
                    minimum: -9007199254740991
                    type: integer
                  - type: 'null'
            required:
              - id
              - name
              - numberOfSlots
            type: object
          type: array
        sisId:
          anyOf:
            - type: string
            - type: 'null'
        students:
          items:
            additionalProperties: false
            properties:
              boarder:
                type: boolean
              captain:
                anyOf:
                  - type: boolean
                  - type: 'null'
              firstName:
                type: string
              jerseyNumber:
                anyOf:
                  - type: string
                  - type: 'null'
              lastName:
                type: string
              legalFirstName:
                anyOf:
                  - type: string
                  - type: 'null'
              positionId:
                anyOf:
                  - exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  - type: 'null'
              smsId:
                anyOf:
                  - type: string
                  - type: 'null'
              studentId:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              yearGroup:
                additionalProperties: false
                properties:
                  id:
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  name:
                    type: string
                required:
                  - id
                  - name
                type: object
            required:
              - studentId
              - firstName
              - legalFirstName
              - lastName
              - smsId
              - yearGroup
              - boarder
              - captain
              - jerseyNumber
              - positionId
            type: object
          type: array
        subcategory:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
      required:
        - id
        - name
        - sisId
        - hidden
        - ageGroup
        - category
        - subcategory
        - activity
      type: object
    TeamListItem:
      additionalProperties: false
      description: A team, ensemble or group of students, as returned in the paginated teams list.
      properties:
        activity:
          additionalProperties: false
          properties:
            department:
              additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            id:
              exclusiveMinimum: 0
              maximum: 9007199254740991
              type: integer
            name:
              type: string
            sisCode:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - id
            - name
            - sisCode
            - department
          type: object
        assignedStaff:
          items:
            additionalProperties: false
            properties:
              firstName:
                type: string
              id:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              lastName:
                type: string
              sisId:
                anyOf:
                  - type: string
                  - type: 'null'
            required:
              - id
              - firstName
              - lastName
              - sisId
            type: object
          type: array
        category:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
        hidden:
          type: boolean
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        name:
          type: string
        positions:
          items:
            additionalProperties: false
            properties:
              id:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              name:
                type: string
              numberOfSlots:
                anyOf:
                  - maximum: 9007199254740991
                    minimum: -9007199254740991
                    type: integer
                  - type: 'null'
            required:
              - id
              - name
              - numberOfSlots
            type: object
          type: array
        sisId:
          anyOf:
            - type: string
            - type: 'null'
        students:
          items:
            additionalProperties: false
            properties:
              boarder:
                type: boolean
              captain:
                anyOf:
                  - type: boolean
                  - type: 'null'
              firstName:
                type: string
              jerseyNumber:
                anyOf:
                  - type: string
                  - type: 'null'
              lastName:
                type: string
              legalFirstName:
                anyOf:
                  - type: string
                  - type: 'null'
              positionId:
                anyOf:
                  - exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  - type: 'null'
              smsId:
                anyOf:
                  - type: string
                  - type: 'null'
              studentId:
                exclusiveMinimum: 0
                maximum: 9007199254740991
                type: integer
              yearGroup:
                additionalProperties: false
                properties:
                  id:
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                    type: integer
                  name:
                    type: string
                required:
                  - id
                  - name
                type: object
            required:
              - studentId
              - firstName
              - legalFirstName
              - lastName
              - smsId
              - yearGroup
              - boarder
              - captain
              - jerseyNumber
              - positionId
            type: object
          type: array
        subcategory:
          anyOf:
            - additionalProperties: false
              properties:
                id:
                  exclusiveMinimum: 0
                  maximum: 9007199254740991
                  type: integer
                name:
                  type: string
              required:
                - id
                - name
              type: object
            - type: 'null'
      required:
        - id
        - name
        - sisId
        - hidden
        - category
        - subcategory
        - activity
      type: object
    User:
      additionalProperties: false
      description: A staff user of the Clipboard App.
      properties:
        activitiesPermissions:
          items:
            $ref: '#/components/schemas/UserActivityPermission'
          type: array
        departments:
          items:
            $ref: '#/components/schemas/UserDepartment'
          type: array
        email:
          type: string
        employeeId:
          anyOf:
            - type: string
            - type: 'null'
        externalId:
          anyOf:
            - type: string
            - type: 'null'
        firstName:
          type: string
        frozen:
          enum:
            - 'yes'
            - 'no'
          type: string
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        inviteEmailLastSentTimestamp:
          anyOf:
            - description: ISO 8601 date-time in UTC (Z suffix).
              example: '2025-06-19T10:30:00Z'
              format: date-time
              type: string
            - type: 'null'
          description: The date-time the most recent invitation email was sent to the user (UTC), or null if none has been sent.
        isAdmin:
          type: boolean
        isManager:
          type: boolean
        lastName:
          type: string
        mobileNumber:
          anyOf:
            - type: string
            - type: 'null'
        payment:
          enum:
            - ts
            - na
          type: string
        secondaryExternalId:
          anyOf:
            - type: string
            - type: 'null'
        sisId:
          anyOf:
            - type: string
            - type: 'null'
          deprecated: true
          description: 'Deprecated: use externalId / secondaryExternalId instead.'
        updatedDetails:
          type: boolean
        wwccExpiryDate:
          anyOf:
            - description: Date and time with no timezone designator, in the format YYYY-MM-DD HH:MM:SS.
              example: '2025-06-19 10:30:00'
              type: string
            - type: 'null'
          description: Expiry of the working-with-children check, with no timezone designator, or null if none is recorded.
        wwccNumber:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - id
        - firstName
        - lastName
        - email
        - mobileNumber
        - isAdmin
        - isManager
        - employeeId
        - frozen
        - wwccNumber
        - wwccExpiryDate
        - updatedDetails
        - sisId
        - externalId
        - secondaryExternalId
        - payment
        - inviteEmailLastSentTimestamp
        - activitiesPermissions
        - departments
      type: object
    UserActivityPermission:
      additionalProperties: false
      description: An activity a user is assigned directly to.
      properties:
        activityId:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        activityName:
          type: string
      required:
        - activityId
        - activityName
      type: object
    UserDepartment:
      additionalProperties: false
      description: A department a user belongs to.
      properties:
        id:
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        name:
          type: string
      required:
        - id
        - name
      type: object
    YearGroup:
      additionalProperties: false
      description: A way to organise students based on their age or the academic year they are enrolled in.
      properties:
        archived:
          description: Whether the year group has been archived.
          type: boolean
        id:
          description: The primary key that uniquely identifies the year group in Clipboard.
          exclusiveMinimum: 0
          maximum: 9007199254740991
          type: integer
        name:
          description: The year group's name, e.g. "Year 7".
          type: string
      required:
        - id
        - name
        - archived
      type: object
  securitySchemes:
    bearerAuth:
      description: Bearer API token provisioned on the Clipboard Integration page (IT Admin only).
      scheme: bearer
      type: http
info:
  description: REST API for accessing your school's extracurricular data on Clipboard. Authenticate with a Bearer API token provisioned on the Integration page (IT Admin only). List endpoints are paginated and return a { data, pagination } envelope. This specification is being rolled out endpoint by endpoint and does not yet cover the whole public API; the written documentation remains authoritative for endpoints not listed here.
  license:
    name: Proprietary
    url: https://www.clipboard.app/legal/integration-data-processing-terms
  title: Clipboard Public API
  version: 1.0.0
openapi: 3.1.0
paths:
  /activities:
    get:
      description: A paginated list of activities for the authenticated organisation.
      operationId: getActivities
      parameters:
        - description: Only return activities for departments with the provided ids.
          in: query
          name: departmentIds
          schema:
            description: Only return activities for departments with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Activities per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Activities per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetActivitiesResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List activities
      tags:
        - Activities
  /activity-selections:
    get:
      description: A paginated list of student activity selections matching the provided filters.
      operationId: getActivitySelections
      parameters:
        - description: Restrict to selections for these activity ids.
          in: query
          name: activityIds
          schema:
            description: Restrict to selections for these activity ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to selections for activities in these department ids.
          in: query
          name: departmentIds
          schema:
            description: Restrict to selections for activities in these department ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to selections for students in these year group ids.
          in: query
          name: yearGroupIds
          schema:
            description: Restrict to selections for students in these year group ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to selections for these season ids.
          in: query
          name: seasonIds
          schema:
            description: Restrict to selections for these season ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to selections for these season activity option ids, as a JSON-encoded array of UUIDs.
          in: query
          name: seasonActivityOptionIds
          schema:
            description: Restrict to selections for these season activity option ids, as a JSON-encoded array of UUIDs.
            example: '["3fd13992-2471-408f-9d02-9bff2e080575"]'
            type: string
        - description: Only return selections made on or after this timestamp.
          in: query
          name: selectionDateStart
          schema:
            description: Only return selections made on or after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return selections made on or before this timestamp.
          in: query
          name: selectionDateEnd
          schema:
            description: Only return selections made on or before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: 'Restrict to selections whose invoice has one of these statuses: unpaid, paid, partially-paid, processing.'
          in: query
          name: invoiceStatus
          schema:
            description: 'Restrict to selections whose invoice has one of these statuses: unpaid, paid, partially-paid, processing.'
            example: '["paid","unpaid"]'
            type: string
        - description: Return deleted (true) or active (false) selections. Defaults to active.
          in: query
          name: isDeleted
          schema:
            default: 'false'
            description: Return deleted (true) or active (false) selections. Defaults to active.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Records per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Records per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetActivitySelectionsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List activity selections
      tags:
        - Activity Selections
  /attendance-records:
    get:
      description: A paginated list of student attendance records for session rolls matching the provided filters.
      operationId: getAttendanceRecords
      parameters:
        - description: Restrict to records for these activity ids.
          in: query
          name: activityIds
          schema:
            description: Restrict to records for these activity ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to records for activities in these department ids.
          in: query
          name: departmentIds
          schema:
            description: Restrict to records for activities in these department ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to records for these student SIS ids.
          in: query
          name: studentSisIds
          schema:
            description: Restrict to records for these student SIS ids.
            example: '["A1","B2"]'
            type: string
        - description: A named relative window for the session date. Use `custom` with startDateTime/endDateTime.
          in: query
          name: timePeriod
          schema:
            description: A named relative window for the session date. Use `custom` with startDateTime/endDateTime.
            enum:
              - today
              - yesterday
              - last-week
              - last-30-days
              - last-90-days
              - last-6-months
              - this-year
              - last-year
              - custom
            type: string
        - description: Start of the session-date window. Must be paired with endDateTime.
          in: query
          name: startDateTime
          schema:
            description: Start of the session-date window. Must be paired with endDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: End of the session-date window. Must be paired with startDateTime.
          in: query
          name: endDateTime
          schema:
            description: End of the session-date window. Must be paired with startDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated before this timestamp.
          in: query
          name: updatedBefore
          schema:
            description: Only return items last updated before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated after this timestamp.
          in: query
          name: updatedAfter
          schema:
            description: Only return items last updated after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Filter by absent (true) or present (false) records.
          in: query
          name: absent
          schema:
            description: Filter by absent (true) or present (false) records.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Filter by explained (true) or unexplained (false) records.
          in: query
          name: explained
          schema:
            description: Filter by explained (true) or unexplained (false) records.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Records per page. Defaults to 30, maximum 300.
          in: query
          name: pageLength
          schema:
            default: 30
            description: Records per page. Defaults to 30, maximum 300.
            maximum: 300
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAttendanceRecordsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List attendance records
      tags:
        - Attendance Records
  /departments:
    get:
      description: A paginated list of departments for the authenticated organisation.
      operationId: getDepartments
      parameters:
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Departments per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Departments per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetDepartmentsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List departments
      tags:
        - Departments
  /incidents:
    get:
      description: A paginated list of incident reports matching the provided filters.
      operationId: getIncidents
      parameters:
        - description: Restrict to incidents for these activity ids.
          in: query
          name: activityIds
          schema:
            description: Restrict to incidents for these activity ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Restrict to incidents for activities in these department ids.
          in: query
          name: departmentIds
          schema:
            description: Restrict to incidents for activities in these department ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Start of the incident date-time window. Must be paired with endDateTime.
          in: query
          name: startDateTime
          schema:
            description: Start of the incident date-time window. Must be paired with endDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: End of the incident date-time window. Must be paired with startDateTime.
          in: query
          name: endDateTime
          schema:
            description: End of the incident date-time window. Must be paired with startDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Restrict to incidents with this concussion status.
          in: query
          name: concussionStatus
          schema:
            description: Restrict to incidents with this concussion status.
            enum:
              - confirmed
              - potential
              - none
            type: string
        - description: Filter by archived (true) or non-archived (false) incidents. Omit to return both.
          in: query
          name: archived
          schema:
            description: Filter by archived (true) or non-archived (false) incidents. Omit to return both.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Only return items last updated before this timestamp.
          in: query
          name: updatedBefore
          schema:
            description: Only return items last updated before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated after this timestamp.
          in: query
          name: updatedAfter
          schema:
            description: Only return items last updated after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Incidents per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Incidents per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetIncidentsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List incidents
      tags:
        - Incidents
  /locations:
    get:
      description: A paginated list of the school's locations matching the provided filters.
      operationId: getLocations
      parameters:
        - description: Return archived locations (true) instead of active ones (false). Defaults to active.
          in: query
          name: archived
          schema:
            default: 'false'
            description: Return archived locations (true) instead of active ones (false). Defaults to active.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Locations per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Locations per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetLocationsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List locations
      tags:
        - Locations
  /pre-explained-absences:
    get:
      description: A paginated list of planned (pre-explained) student absences matching the provided filters.
      operationId: getPreExplainedAbsences
      parameters:
        - description: Restrict to absences for these student ids.
          in: query
          name: studentIds
          schema:
            description: Restrict to absences for these student ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Filter by explained (true) or unexplained (false) absences.
          in: query
          name: explained
          schema:
            description: Filter by explained (true) or unexplained (false) absences.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Start of the window; absences active on or after this are returned. Must be paired with endDateTime.
          in: query
          name: startDateTime
          schema:
            description: Start of the window; absences active on or after this are returned. Must be paired with endDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: End of the window; absences active on or before this are returned. Must be paired with startDateTime.
          in: query
          name: endDateTime
          schema:
            description: End of the window; absences active on or before this are returned. Must be paired with startDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated before this timestamp.
          in: query
          name: updatedBefore
          schema:
            description: Only return items last updated before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated after this timestamp.
          in: query
          name: updatedAfter
          schema:
            description: Only return items last updated after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Records per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Records per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetPreExplainedAbsencesResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List pre-explained absences
      tags:
        - Pre-Explained Absences
  /sessions:
    get:
      description: A paginated list of Sessions matching the provided filters, in chronological order. With format=ics or format=iCalendar the same Sessions are returned as an iCalendar feed (text/calendar) instead of this envelope.
      operationId: getSessions
      parameters:
        - description: Only return Sessions for Activities with the provided ids.
          in: query
          name: activityIds
          schema:
            description: Only return Sessions for Activities with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return Sessions for Departments with the provided ids.
          in: query
          name: departmentIds
          schema:
            description: Only return Sessions for Departments with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return Sessions held at the provided location ids.
          in: query
          name: locationIds
          schema:
            description: Only return Sessions held at the provided location ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return Sessions that include the provided team id.
          in: query
          name: teamId
          schema:
            description: Only return Sessions that include the provided team id.
            example: 42
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: 'Only return Sessions that intersect the range of startDateTime and endDateTime. Supply both or neither: a lone bound is ignored and the default range applies, which is four weeks either side of now, extended to six months ahead when a teamId is provided. An iCalendar response ignores both bounds and uses its own fixed range; see format.'
          in: query
          name: startDateTime
          schema:
            description: 'Only return Sessions that intersect the range of startDateTime and endDateTime. Supply both or neither: a lone bound is ignored and the default range applies, which is four weeks either side of now, extended to six months ahead when a teamId is provided. An iCalendar response ignores both bounds and uses its own fixed range; see format.'
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: 'The end of the range to return Sessions within. Supply both or neither: a lone bound is ignored and the default range applies. An iCalendar response ignores both bounds; see format.'
          in: query
          name: endDateTime
          schema:
            description: 'The end of the range to return Sessions within. Supply both or neither: a lone bound is ignored and the default range applies. An iCalendar response ignores both bounds; see format.'
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Return only cancelled (true) or only non-cancelled (false) Sessions. Omit to return both. The value is case-insensitive.
          in: query
          name: cancelled
          schema:
            description: Return only cancelled (true) or only non-cancelled (false) Sessions. Omit to return both. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Return only byes (true) or only non-byes (false). Omit to return both. The value is case-insensitive.
          in: query
          name: bye
          schema:
            description: Return only byes (true) or only non-byes (false). Omit to return both. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Return only Fixtures (true) or only Sessions (false). Omit to return both. The value is case-insensitive.
          in: query
          name: scored
          schema:
            description: Return only Fixtures (true) or only Sessions (false). Omit to return both. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Only return Sessions that have students with the provided SIS ids assigned. Integer elements are accepted and coerced to strings.
          in: query
          name: sisIds
          schema:
            description: Only return Sessions that have students with the provided SIS ids assigned. Integer elements are accepted and coerced to strings.
            example: '["A1","B2"]'
            type: string
        - description: Only return Sessions whose status is one of those provided.
          in: query
          name: includeStatuses
          schema:
            description: Only return Sessions whose status is one of those provided.
            example: '["confirmed","unconfirmed"]'
            type: string
        - description: Also include the teams and students arrays for each Session. The value is case-insensitive.
          in: query
          name: includeTeams
          schema:
            description: Also include the teams and students arrays for each Session. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Also include the assignedStaff array for each Session. The value is case-insensitive.
          in: query
          name: includeStaff
          schema:
            description: Also include the assignedStaff array for each Session. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Also include the round name of each Fixture. The value is case-insensitive.
          in: query
          name: includeRoundName
          schema:
            description: Also include the round name of each Fixture. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Used with sisIds. Also include the matching student SIS ids for each Session. Requires sisIds unless a teamId is provided. The value is case-insensitive.
          in: query
          name: includeSisIds
          schema:
            description: Used with sisIds. Also include the matching student SIS ids for each Session. Requires sisIds unless a teamId is provided. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Also include the relevant custom fields metadata. Defaults to false for the JSON response and to true for the iCalendar response (format=ics or format=iCalendar), where custom fields are folded into each event description unless this is explicitly false. The value is case-insensitive.
          in: query
          name: includeCustomFieldsMetadata
          schema:
            description: Also include the relevant custom fields metadata. Defaults to false for the JSON response and to true for the iCalendar response (format=ics or format=iCalendar), where custom fields are folded into each event description unless this is explicitly false. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: When true, only return Sessions that are not associated with any team. The value is case-insensitive.
          in: query
          name: excludeSessionsWithTeams
          schema:
            description: When true, only return Sessions that are not associated with any team. The value is case-insensitive.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Only return items last updated before this timestamp.
          in: query
          name: updatedBefore
          schema:
            description: Only return items last updated before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated after this timestamp.
          in: query
          name: updatedAfter
          schema:
            description: Only return items last updated after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Return an iCalendar feed (media type text/calendar) instead of the JSON envelope. The query parameters that restrict the JSON response apply, except that the date range is fixed to one month back and three months ahead and the page length to 200.
          in: query
          name: format
          schema:
            description: Return an iCalendar feed (media type text/calendar) instead of the JSON envelope. The query parameters that restrict the JSON response apply, except that the date range is fixed to one month back and three months ahead and the page length to 200.
            enum:
              - ics
              - iCalendar
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Sessions per page. Defaults to 100. A value above 1000 is capped at 1000.
          in: query
          name: pageLength
          schema:
            description: Sessions per page. Defaults to 100. A value above 1000 is capped at 1000.
            maximum: 9007199254740991
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetSessionsResponse'
            text/calendar:
              schema:
                $ref: '#/components/schemas/SessionsCalendar'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List sessions
      tags:
        - Sessions
  /sessions/{id}:
    get:
      description: The details of a single Session, optionally including its assigned staff, teams, students and custom fields metadata.
      operationId: getSessionsById
      parameters:
        - description: The unique Clipboard identifier of the Session.
          in: path
          name: id
          required: true
          schema:
            description: The unique Clipboard identifier of the Session.
            example: 358
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: Also include the `teams` and `students` arrays for the Session.
          in: query
          name: includeTeams
          schema:
            default: 'false'
            description: Also include the `teams` and `students` arrays for the Session.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Also include the `assignedStaff` array for the Session.
          in: query
          name: includeStaff
          schema:
            default: 'false'
            description: Also include the `assignedStaff` array for the Session.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Also include the custom fields metadata for the Session.
          in: query
          name: includeCustomFieldsMetadata
          schema:
            default: 'false'
            description: Also include the custom fields metadata for the Session.
            enum:
              - 'true'
              - 'false'
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetSessionByIdResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No session with the given id exists.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: Get a session
      tags:
        - Sessions
  /student-teams:
    get:
      description: A paginated list of student team memberships matching the provided filters.
      operationId: getStudentTeams
      parameters:
        - description: Only return student teams for the activity with this Clipboard id.
          in: query
          name: activityId
          schema:
            description: Only return student teams for the activity with this Clipboard id.
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: Only return student teams for these students, identified by their Clipboard primary key.
          in: query
          name: studentIds
          schema:
            description: Only return student teams for these students, identified by their Clipboard primary key.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Start of the membership date-time window (UTC). Must be paired with endDateTime.
          in: query
          name: startDateTime
          schema:
            description: Start of the membership date-time window (UTC). Must be paired with endDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: End of the membership date-time window (UTC). Must be paired with startDateTime.
          in: query
          name: endDateTime
          schema:
            description: End of the membership date-time window (UTC). Must be paired with startDateTime.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Student teams per page. Defaults to 100, maximum 300.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Student teams per page. Defaults to 100, maximum 300.
            maximum: 300
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetStudentTeamsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List student teams
      tags:
        - Student Teams
  /students:
    get:
      description: A paginated list of students matching the provided filters.
      operationId: getStudents
      parameters:
        - description: Return only current students (true) or only non-current students (false). Defaults to true.
          in: query
          name: current
          schema:
            default: 'true'
            description: Return only current students (true) or only non-current students (false). Defaults to true.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Restrict to students matching these SIS ids (primary or secondary). Integer elements are accepted and coerced to strings.
          in: query
          name: sisIds
          schema:
            description: Restrict to students matching these SIS ids (primary or secondary). Integer elements are accepted and coerced to strings.
            example: '["A1","B2"]'
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Students per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Students per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetStudentsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List students
      tags:
        - Students
  /teams:
    get:
      description: A paginated list of teams matching the provided filters.
      operationId: getTeams
      parameters:
        - description: Only return teams for the activity with the provided id.
          in: query
          name: activityId
          schema:
            description: Only return teams for the activity with the provided id.
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: Only return teams for activities in the departments with the provided ids.
          in: query
          name: departmentIds
          schema:
            description: Only return teams for activities in the departments with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return teams in the category with the provided id.
          in: query
          name: categoryId
          schema:
            description: Only return teams in the category with the provided id.
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: Return only hidden teams (true) or only non-hidden teams (false). Defaults to false.
          in: query
          name: hidden
          schema:
            default: 'false'
            description: Return only hidden teams (true) or only non-hidden teams (false). Defaults to false.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Include the assigned staff (users) for each team.
          in: query
          name: includeStaff
          schema:
            description: Include the assigned staff (users) for each team.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Include the students for each team.
          in: query
          name: includeStudents
          schema:
            description: Include the students for each team.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Include the positions for each team.
          in: query
          name: includePositions
          schema:
            description: Include the positions for each team.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: Only return teams for students with the provided SIS ids. Integer elements are accepted and coerced to strings.
          in: query
          name: sisIds
          schema:
            description: Only return teams for students with the provided SIS ids. Integer elements are accepted and coerced to strings.
            example: '["A1","B2"]'
            type: string
        - description: Show the students and assigned staff as at the provided UTC timestamp.
          in: query
          name: showAsOfDate
          schema:
            description: Show the students and assigned staff as at the provided UTC timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return teams for assigned staff members with the provided ids.
          in: query
          name: userIds
          schema:
            description: Only return teams for assigned staff members with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return items last updated before this timestamp.
          in: query
          name: updatedBefore
          schema:
            description: Only return items last updated before this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: Only return items last updated after this timestamp.
          in: query
          name: updatedAfter
          schema:
            description: Only return items last updated after this timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: 'Teams per page. Defaults to 15. Results are automatically limited to 50 per page: values above 50 are accepted but return at most 50 teams.'
          in: query
          name: pageLength
          schema:
            default: 15
            description: 'Teams per page. Defaults to 15. Results are automatically limited to 50 per page: values above 50 are accepted but return at most 50 teams.'
            maximum: 9007199254740991
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetTeamsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List teams
      tags:
        - Teams
  /teams/{id}:
    get:
      description: The details of a single team, including its assigned staff, students and positions.
      operationId: getTeamsById
      parameters:
        - description: The unique Clipboard identifier of the Team.
          in: path
          name: id
          required: true
          schema:
            description: The unique Clipboard identifier of the Team.
            example: 12973
            exclusiveMinimum: 0
            maximum: 9007199254740991
            type: integer
        - description: Show the students and assigned staff as at the provided UTC timestamp.
          in: query
          name: showAsOfDate
          schema:
            description: Show the students and assigned staff as at the provided UTC timestamp.
            example: '2025-06-19T10:30:00Z'
            format: date-time
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetTeamByIdResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No team with the given id exists.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: Get a team
      tags:
        - Teams
  /users:
    get:
      description: A paginated list of staff users matching the provided filters.
      operationId: getUsers
      parameters:
        - description: Only return users assigned to activities with the provided ids.
          in: query
          name: activityIds
          schema:
            description: Only return users assigned to activities with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: Only return users assigned to (or within) departments with the provided ids.
          in: query
          name: departmentIds
          schema:
            description: Only return users assigned to (or within) departments with the provided ids.
            example: '[1,2,3]'
            pattern: ^(\[\s*[1-9]\d{0,14}(\s*,\s*[1-9]\d{0,14})*\s*\]|[1-9]\d{0,14})$
            type: string
        - description: 'Filter users by permission type: 0 = Staff, 1 = Manager, 2 = Admin.'
          in: query
          name: permissionTypes
          schema:
            description: 'Filter users by permission type: 0 = Staff, 1 = Manager, 2 = Admin.'
            example: '[0,2]'
            type: string
        - description: Filter by deactivated (true, formerly "frozen") or activated (false) users. Omit to return both.
          in: query
          name: frozen
          schema:
            description: Filter by deactivated (true, formerly "frozen") or activated (false) users. Omit to return both.
            enum:
              - 'true'
              - 'false'
            type: string
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Users per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Users per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetUsersResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List users
      tags:
        - Users
  /year-groups:
    get:
      description: A paginated list of year groups for the authenticated organisation.
      operationId: getYearGroups
      parameters:
        - description: The page of results to return (1-indexed). Defaults to 1.
          in: query
          name: page
          schema:
            default: 1
            description: The page of results to return (1-indexed). Defaults to 1.
            maximum: 9007199254740991
            minimum: 1
            type: integer
        - description: Year groups per page. Defaults to 100, maximum 200.
          in: query
          name: pageLength
          schema:
            default: 100
            description: Year groups per page. Defaults to 100, maximum 200.
            maximum: 200
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetYearGroupsResponse'
          description: The request succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Bad request, e.g. an invalid pagination parameter.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: No valid API token was provided.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The API token does not have permission to perform the request.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: A parameter was invalid or malformed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Too many requests.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Something went wrong on Clipboard's end.
      summary: List year groups
      tags:
        - Year Groups
security:
  - bearerAuth: []
servers:
  - description: Clipboard Public API
    url: https://api.clipboard.app
tags:
  - description: Activities offered by the organisation, each belonging to a department.
    name: Activities
  - description: Student selections of activities offered for a season.
    name: Activity Selections
  - description: Student attendance records for session rolls.
    name: Attendance Records
  - description: Overarching categories that activities fall under, e.g. Music, Co-Curricular or Sport.
    name: Departments
  - description: Incident reports logged against students, e.g. injuries or concussion checks.
    name: Incidents
  - description: Places or venues at which sessions or fixtures can be held.
    name: Locations
  - description: Planned absences submitted ahead of time so a student is excused.
    name: Pre-Explained Absences
  - description: Calendar events such as lessons, rehearsals and fixtures, and the rolls taken for them.
    name: Sessions
  - description: Students enrolled at the school.
    name: Students
  - description: A student's membership of a team, and the window over which it was held.
    name: Student Teams
  - description: Teams, ensembles and groups of students.
    name: Teams
  - description: Staff users of the Clipboard App.
    name: Users
  - description: Groupings of students by age or the academic year they are enrolled in.
    name: Year Groups
