{
  "components": {
    "schemas": {
      "AnswerRequest": {
        "properties": {
          "answer": {},
          "questionId": {
            "$ref": "#/components/schemas/UUID"
          }
        },
        "type": "object"
      },
      "CreateLessonRequest": {
        "properties": {
          "contentHtml": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "isMandatory": {
            "type": "boolean"
          },
          "lessonType": {
            "type": "string"
          },
          "moduleId": {
            "$ref": "#/components/schemas/UUID"
          },
          "sortOrder": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "pattern": "\\S",
            "type": "string"
          }
        },
        "required": [
          "moduleId",
          "title"
        ],
        "type": "object"
      },
      "CreateModuleRequest": {
        "properties": {
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "description": {
            "type": "string"
          },
          "isLocked": {
            "type": "boolean"
          },
          "sortOrder": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "pattern": "\\S",
            "type": "string"
          }
        },
        "required": [
          "courseId",
          "title"
        ],
        "type": "object"
      },
      "CreateRequest": {
        "properties": {
          "category": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "difficultyLevel": {
            "type": "string"
          },
          "programId": {
            "$ref": "#/components/schemas/UUID"
          },
          "targetAudience": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "thumbnailUrl": {
            "type": "string"
          },
          "title": {
            "pattern": "\\S",
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "FileUpload": {
        "type": "object"
      },
      "LmsAssignment": {
        "properties": {
          "allowLateSubmission": {
            "type": "boolean"
          },
          "assignmentType": {
            "type": "string"
          },
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "createdBy": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "dueDate": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "instructions": {
            "type": "string"
          },
          "latePenaltyPercent": {
            "format": "int32",
            "type": "integer"
          },
          "maxAttempts": {
            "format": "int32",
            "type": "integer"
          },
          "maxScore": {
            "format": "int32",
            "type": "integer"
          },
          "moduleId": {
            "$ref": "#/components/schemas/UUID"
          },
          "passingScore": {
            "format": "int32",
            "type": "integer"
          },
          "resourceUrls": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "rubric": {
            "additionalProperties": {},
            "type": "object"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          }
        },
        "type": "object"
      },
      "LmsForumReply": {
        "properties": {
          "authorId": {
            "type": "string"
          },
          "authorName": {
            "type": "string"
          },
          "authorRole": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "isAcceptedAnswer": {
            "type": "boolean"
          },
          "parentReplyId": {
            "$ref": "#/components/schemas/UUID"
          },
          "threadId": {
            "$ref": "#/components/schemas/UUID"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "upvotes": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "LmsForumThread": {
        "properties": {
          "authorId": {
            "type": "string"
          },
          "authorName": {
            "type": "string"
          },
          "authorRole": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "isLocked": {
            "type": "boolean"
          },
          "isPinned": {
            "type": "boolean"
          },
          "lastReplyAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "likesCount": {
            "format": "int32",
            "type": "integer"
          },
          "programId": {
            "$ref": "#/components/schemas/UUID"
          },
          "replyCount": {
            "format": "int32",
            "type": "integer"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "viewsCount": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "LmsLiveClass": {
        "properties": {
          "actualParticipants": {
            "format": "int32",
            "type": "integer"
          },
          "batchId": {
            "$ref": "#/components/schemas/UUID"
          },
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "description": {
            "type": "string"
          },
          "durationMinutes": {
            "format": "int32",
            "type": "integer"
          },
          "egressId": {
            "type": "string"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "maxParticipants": {
            "format": "int32",
            "type": "integer"
          },
          "meetingRoomId": {
            "type": "string"
          },
          "meetingUrl": {
            "type": "string"
          },
          "mentorId": {
            "type": "string"
          },
          "mentorName": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "programId": {
            "$ref": "#/components/schemas/UUID"
          },
          "recordingStatus": {
            "type": "string"
          },
          "recordingUrl": {
            "type": "string"
          },
          "scheduledAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "status": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          }
        },
        "type": "object"
      },
      "LmsQuiz": {
        "properties": {
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "createdBy": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "isPublished": {
            "type": "boolean"
          },
          "maxAttempts": {
            "format": "int32",
            "type": "integer"
          },
          "moduleId": {
            "$ref": "#/components/schemas/UUID"
          },
          "passingScore": {
            "format": "int32",
            "type": "integer"
          },
          "quizType": {
            "type": "string"
          },
          "showCorrectAnswers": {
            "type": "boolean"
          },
          "shuffleQuestions": {
            "type": "boolean"
          },
          "timeLimitMinutes": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "updatedAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          }
        },
        "type": "object"
      },
      "LmsQuizQuestion": {
        "properties": {
          "correctAnswer": {},
          "createdAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "difficulty": {
            "type": "string"
          },
          "explanation": {
            "type": "string"
          },
          "id": {
            "$ref": "#/components/schemas/UUID"
          },
          "options": {
            "items": {},
            "type": "array"
          },
          "points": {
            "format": "int32",
            "type": "integer"
          },
          "questionText": {
            "type": "string"
          },
          "questionType": {
            "type": "string"
          },
          "quizId": {
            "$ref": "#/components/schemas/UUID"
          },
          "sortOrder": {
            "format": "int32",
            "type": "integer"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "LocalDateTime": {
        "example": "2022-03-10T12:15:50",
        "format": "date-time",
        "type": "string"
      },
      "ProgressRequest": {
        "properties": {
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "lastPositionSeconds": {
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "participantId": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "watchDurationSeconds": {
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "courseId"
        ],
        "type": "object"
      },
      "QuestionSetRequest": {
        "properties": {
          "questions": {
            "items": {
              "$ref": "#/components/schemas/QuestionUpsert"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "QuestionUpsert": {
        "properties": {
          "correctAnswer": {},
          "explanation": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "options": {
            "items": {},
            "type": "array"
          },
          "points": {
            "format": "int32",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "questionText": {
            "type": "string"
          },
          "questionType": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ScheduleRequest": {
        "properties": {
          "batchId": {
            "$ref": "#/components/schemas/UUID"
          },
          "courseId": {
            "$ref": "#/components/schemas/UUID"
          },
          "description": {
            "type": "string"
          },
          "durationMinutes": {
            "format": "int32",
            "maximum": 1440,
            "minimum": 1,
            "type": "integer"
          },
          "maxParticipants": {
            "format": "int32",
            "maximum": 10000,
            "minimum": 1,
            "type": "integer"
          },
          "mentorId": {
            "pattern": "\\S",
            "type": "string"
          },
          "mentorName": {
            "type": "string"
          },
          "programId": {
            "$ref": "#/components/schemas/UUID"
          },
          "scheduledAt": {
            "$ref": "#/components/schemas/LocalDateTime"
          },
          "title": {
            "pattern": "\\S",
            "type": "string"
          }
        },
        "required": [
          "title",
          "mentorId",
          "scheduledAt"
        ],
        "type": "object"
      },
      "SubmissionRequest": {
        "properties": {
          "answers": {
            "items": {
              "$ref": "#/components/schemas/AnswerRequest"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "UUID": {
        "format": "uuid",
        "pattern": "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}",
        "type": "string"
      },
      "UpdateRequest": {
        "properties": {
          "category": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "difficultyLevel": {
            "type": "string"
          },
          "sortOrder": {
            "format": "int32",
            "type": "integer"
          },
          "targetAudience": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "thumbnailUrl": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "type": "object"
      }
    },
    "securitySchemes": {
      "keycloak-bearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Access token issued by the Keycloak realm `startupos`. Send it as `Authorization: Bearer <token>`. A missing, expired or invalid token returns 401; a valid token without the required role returns 403."
      },
      "stream-token": {
        "type": "apiKey",
        "in": "query",
        "name": "token",
        "description": "Short-lived, enrolment-scoped stream token minted by the matching authenticated `stream-token` operation. Used because a cross-origin video element cannot send an Authorization header."
      },
      "livekit-signature": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization",
        "description": "JWT signed by the LiveKit server, sent without a `Bearer ` prefix and verified by the service. Only the LiveKit server calls this operation."
      }
    }
  },
  "info": {
    "title": "StartupOS lms service",
    "version": "a54687de",
    "description": "Generated at build time from the service's JAX-RS resources (SmallRye OpenAPI) and annotated by the overlay in docs-site/openapi/overlays. Every operation requires a Keycloak access token unless the operation says otherwise. Health and metrics endpoints are internal and are not documented."
  },
  "openapi": "3.0.3",
  "paths": {
    "/api/v1/lms/assignments": {
      "post": {
        "operationId": "AssignmentResource_createAssignment",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsAssignment"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Create assignment"
      }
    },
    "/api/v1/lms/assignments/course/{courseId}": {
      "get": {
        "operationId": "AssignmentResource_getAssignmentsByCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Get assignments by course"
      }
    },
    "/api/v1/lms/assignments/my-assignments": {
      "get": {
        "operationId": "AssignmentResource_myAssignments",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "My assignments"
      }
    },
    "/api/v1/lms/assignments/my-peer-reviews": {
      "get": {
        "operationId": "AssignmentResource_myPeerReviews",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "My peer reviews"
      }
    },
    "/api/v1/lms/assignments/my-submissions": {
      "get": {
        "operationId": "AssignmentResource_mySubmissions",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "My submissions"
      }
    },
    "/api/v1/lms/assignments/peer-reviews/{peerReviewId}": {
      "post": {
        "operationId": "AssignmentResource_submitPeerReview",
        "parameters": [
          {
            "in": "path",
            "name": "peerReviewId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Submit peer review"
      }
    },
    "/api/v1/lms/assignments/pending-reviews": {
      "get": {
        "operationId": "AssignmentResource_pendingReviews",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Pending reviews"
      }
    },
    "/api/v1/lms/assignments/submissions/{submissionId}": {
      "get": {
        "operationId": "AssignmentResource_getSubmission",
        "parameters": [
          {
            "in": "path",
            "name": "submissionId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Get submission"
      }
    },
    "/api/v1/lms/assignments/submissions/{submissionId}/peer-reviewers": {
      "post": {
        "operationId": "AssignmentResource_assignPeerReviewers",
        "parameters": [
          {
            "in": "path",
            "name": "submissionId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Assign peer reviewers"
      }
    },
    "/api/v1/lms/assignments/submissions/{submissionId}/peer-reviews": {
      "get": {
        "operationId": "AssignmentResource_listPeerReviews",
        "parameters": [
          {
            "in": "path",
            "name": "submissionId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "List peer reviews"
      }
    },
    "/api/v1/lms/assignments/submissions/{submissionId}/review": {
      "post": {
        "operationId": "AssignmentResource_reviewSubmission",
        "parameters": [
          {
            "in": "path",
            "name": "submissionId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Review submission"
      }
    },
    "/api/v1/lms/assignments/{assignmentId}": {
      "get": {
        "operationId": "AssignmentResource_getAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignmentId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Get assignment"
      },
      "put": {
        "operationId": "AssignmentResource_updateAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignmentId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsAssignment"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Update assignment"
      }
    },
    "/api/v1/lms/assignments/{assignmentId}/submissions": {
      "get": {
        "operationId": "AssignmentResource_getSubmissions",
        "parameters": [
          {
            "in": "path",
            "name": "assignmentId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Get submissions"
      }
    },
    "/api/v1/lms/assignments/{assignmentId}/submit": {
      "post": {
        "operationId": "AssignmentResource_submitAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignmentId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Assignments"
        ],
        "summary": "Submit assignment"
      }
    },
    "/api/v1/lms/certificate-templates": {
      "get": {
        "operationId": "CertificateTemplateResource_listTemplates",
        "parameters": [
          {
            "in": "query",
            "name": "programId",
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificate templates"
        ],
        "summary": "List templates"
      }
    },
    "/api/v1/lms/certificate-templates/for-course/{courseId}": {
      "get": {
        "operationId": "CertificateTemplateResource_templateForCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificate templates"
        ],
        "summary": "Template for course"
      }
    },
    "/api/v1/lms/certificate-templates/{templateId}": {
      "get": {
        "operationId": "CertificateTemplateResource_getTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "templateId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificate templates"
        ],
        "summary": "Get template"
      }
    },
    "/api/v1/lms/certificates": {
      "get": {
        "operationId": "CertificateResource_listAllCertificates",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "List all certificates"
      }
    },
    "/api/v1/lms/certificates/eligibility": {
      "get": {
        "operationId": "CertificateResource_checkEligibility",
        "parameters": [
          {
            "in": "query",
            "name": "courseId",
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "participantId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Check eligibility"
      }
    },
    "/api/v1/lms/certificates/issue": {
      "post": {
        "operationId": "CertificateResource_issueCertificate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Issue certificate"
      }
    },
    "/api/v1/lms/certificates/my-certificates": {
      "get": {
        "operationId": "CertificateResource_myCertificates",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "My certificates"
      }
    },
    "/api/v1/lms/certificates/verify/{key}": {
      "get": {
        "operationId": "CertificateResource_verifyCertificate",
        "parameters": [
          {
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Verify a certificate by its verification key",
        "security": [],
        "description": "Public by design. The verification key is an unguessable identifier (capability URL)."
      }
    },
    "/api/v1/lms/certificates/{certificateId}": {
      "get": {
        "operationId": "CertificateResource_getCertificate",
        "parameters": [
          {
            "in": "path",
            "name": "certificateId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Get certificate"
      }
    },
    "/api/v1/lms/certificates/{certificateId}/pdf": {
      "get": {
        "operationId": "CertificateResource_downloadCertificatePdf",
        "parameters": [
          {
            "in": "path",
            "name": "certificateId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Download a certificate as PDF",
        "security": [],
        "description": "Public by design. The certificate id is an unguessable UUID (capability URL)."
      }
    },
    "/api/v1/lms/certificates/{certificateId}/qr": {
      "get": {
        "operationId": "CertificateResource_downloadCertificateQr",
        "parameters": [
          {
            "in": "path",
            "name": "certificateId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Certificates"
        ],
        "summary": "Download a certificate's QR code",
        "security": [],
        "description": "Public by design. The certificate id is an unguessable UUID (capability URL)."
      }
    },
    "/api/v1/lms/courses": {
      "get": {
        "operationId": "CourseResource_listCourses",
        "parameters": [
          {
            "in": "query",
            "name": "all",
            "schema": {
              "default": false,
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "page",
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "programId",
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "size",
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "List courses"
      },
      "post": {
        "operationId": "CourseResource_createCourse",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Create course"
      }
    },
    "/api/v1/lms/courses/enrollment-counts": {
      "get": {
        "operationId": "CourseResource_enrollmentCounts",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Enrollment counts"
      }
    },
    "/api/v1/lms/courses/my-enrollments": {
      "get": {
        "operationId": "CourseResource_myEnrollments",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "My enrollments"
      }
    },
    "/api/v1/lms/courses/{courseId}": {
      "delete": {
        "operationId": "CourseResource_deleteCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Delete course"
      },
      "get": {
        "operationId": "CourseResource_getCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Get course"
      },
      "put": {
        "operationId": "CourseResource_updateCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Update course"
      }
    },
    "/api/v1/lms/courses/{courseId}/complete": {
      "post": {
        "operationId": "CourseResource_completeCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Complete course"
      }
    },
    "/api/v1/lms/courses/{courseId}/enroll": {
      "post": {
        "operationId": "CourseResource_enroll",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Enroll"
      }
    },
    "/api/v1/lms/courses/{courseId}/publish": {
      "put": {
        "operationId": "CourseResource_publishCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "boolean"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Courses"
        ],
        "summary": "Publish course"
      }
    },
    "/api/v1/lms/dashboard/stats": {
      "get": {
        "operationId": "DashboardResource_getDashboardStats",
        "parameters": [
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Dashboard"
        ],
        "summary": "Get dashboard stats"
      }
    },
    "/api/v1/lms/forum/replies/{replyId}": {
      "delete": {
        "operationId": "ForumResource_deleteReply",
        "parameters": [
          {
            "in": "path",
            "name": "replyId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Delete reply"
      }
    },
    "/api/v1/lms/forum/replies/{replyId}/accept": {
      "put": {
        "operationId": "ForumResource_acceptAnswer",
        "parameters": [
          {
            "in": "path",
            "name": "replyId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "boolean"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Accept answer"
      }
    },
    "/api/v1/lms/forum/replies/{replyId}/upvote": {
      "post": {
        "operationId": "ForumResource_upvote",
        "parameters": [
          {
            "in": "path",
            "name": "replyId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Upvote"
      }
    },
    "/api/v1/lms/forum/threads": {
      "get": {
        "operationId": "ForumResource_getAllThreads",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "size",
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Get all threads"
      },
      "post": {
        "operationId": "ForumResource_createThread",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsForumThread"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Create thread"
      }
    },
    "/api/v1/lms/forum/threads/course/{courseId}": {
      "get": {
        "operationId": "ForumResource_getThreadsByCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "page",
            "schema": {
              "default": 0,
              "format": "int32",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "size",
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Get threads by course"
      }
    },
    "/api/v1/lms/forum/threads/{threadId}": {
      "delete": {
        "operationId": "ForumResource_deleteThread",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Delete thread"
      },
      "get": {
        "operationId": "ForumResource_getThread",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Get thread"
      }
    },
    "/api/v1/lms/forum/threads/{threadId}/like": {
      "post": {
        "operationId": "ForumResource_likeThread",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Like thread"
      }
    },
    "/api/v1/lms/forum/threads/{threadId}/lock": {
      "put": {
        "operationId": "ForumResource_lockThread",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "boolean"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Lock thread"
      }
    },
    "/api/v1/lms/forum/threads/{threadId}/pin": {
      "put": {
        "operationId": "ForumResource_pinThread",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "boolean"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Pin thread"
      }
    },
    "/api/v1/lms/forum/threads/{threadId}/replies": {
      "post": {
        "operationId": "ForumResource_addReply",
        "parameters": [
          {
            "in": "path",
            "name": "threadId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsForumReply"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Forum"
        ],
        "summary": "Add reply"
      }
    },
    "/api/v1/lms/lessons": {
      "post": {
        "operationId": "LessonResource_createLesson",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLessonRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Create lesson"
      }
    },
    "/api/v1/lms/lessons/course/{courseId}": {
      "get": {
        "operationId": "LessonResource_lessonsByCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Lessons by course"
      }
    },
    "/api/v1/lms/lessons/course/{courseId}/progress": {
      "get": {
        "operationId": "LessonResource_courseProgress",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Course progress"
      }
    },
    "/api/v1/lms/lessons/module/{moduleId}": {
      "get": {
        "operationId": "LessonResource_lessonsByModule",
        "parameters": [
          {
            "in": "path",
            "name": "moduleId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Lessons by module"
      }
    },
    "/api/v1/lms/lessons/{lessonId}": {
      "get": {
        "operationId": "LessonResource_getLesson",
        "parameters": [
          {
            "in": "path",
            "name": "lessonId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Get lesson"
      }
    },
    "/api/v1/lms/lessons/{lessonId}/progress": {
      "post": {
        "operationId": "LessonResource_recordProgress",
        "parameters": [
          {
            "in": "path",
            "name": "lessonId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProgressRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Record progress"
      }
    },
    "/api/v1/lms/lessons/{lessonId}/stream": {
      "get": {
        "operationId": "LessonResource_stream",
        "parameters": [
          {
            "in": "path",
            "name": "lessonId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Range",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Stream a lesson video",
        "security": [
          {
            "stream-token": []
          }
        ],
        "description": "Authorised by the `token` query parameter, minted by `LessonResource_streamToken`. Supports HTTP Range requests."
      }
    },
    "/api/v1/lms/lessons/{lessonId}/stream-token": {
      "get": {
        "operationId": "LessonResource_streamToken",
        "parameters": [
          {
            "in": "path",
            "name": "lessonId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Mint a stream token for a lesson video"
      }
    },
    "/api/v1/lms/lessons/{lessonId}/video": {
      "post": {
        "operationId": "LessonResource_uploadVideo",
        "parameters": [
          {
            "in": "path",
            "name": "lessonId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "file": {
                    "$ref": "#/components/schemas/FileUpload"
                  }
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Lessons"
        ],
        "summary": "Upload video"
      }
    },
    "/api/v1/lms/live-classes": {
      "get": {
        "operationId": "LiveClassResource_getAll",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get all"
      },
      "post": {
        "operationId": "LiveClassResource_scheduleClass",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScheduleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Schedule class"
      }
    },
    "/api/v1/lms/live-classes/egress-webhook": {
      "post": {
        "operationId": "EgressWebhookResource_handle",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "format": "binary",
                "type": "string"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Egress webhook"
        ],
        "summary": "Receive a LiveKit egress or track event",
        "security": [
          {
            "livekit-signature": []
          }
        ],
        "description": "Called only by the LiveKit server. The signed JWT in the Authorization header is verified by the service."
      }
    },
    "/api/v1/lms/live-classes/mentor/{mentorId}": {
      "get": {
        "operationId": "LiveClassResource_getByMentor",
        "parameters": [
          {
            "in": "path",
            "name": "mentorId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get by mentor"
      }
    },
    "/api/v1/lms/live-classes/program/{programId}": {
      "get": {
        "operationId": "LiveClassResource_getByProgram",
        "parameters": [
          {
            "in": "path",
            "name": "programId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get by program"
      }
    },
    "/api/v1/lms/live-classes/upcoming": {
      "get": {
        "operationId": "LiveClassResource_getUpcoming",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get upcoming"
      }
    },
    "/api/v1/lms/live-classes/{classId}": {
      "delete": {
        "operationId": "LiveClassResource_deleteClass",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Delete class"
      },
      "put": {
        "operationId": "LiveClassResource_updateClass",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsLiveClass"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Update class"
      }
    },
    "/api/v1/lms/live-classes/{classId}/attendance": {
      "get": {
        "operationId": "LiveClassResource_getClassAttendance",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get class attendance"
      }
    },
    "/api/v1/lms/live-classes/{classId}/attendance/join": {
      "post": {
        "operationId": "LiveClassResource_recordAttendanceJoin",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Record attendance join"
      }
    },
    "/api/v1/lms/live-classes/{classId}/end": {
      "post": {
        "operationId": "LiveClassResource_endClass",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "End class"
      }
    },
    "/api/v1/lms/live-classes/{classId}/join": {
      "get": {
        "operationId": "LiveClassResource_getJoinUrl",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "isMentor",
            "schema": {
              "default": false,
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "participantName",
            "schema": {
              "default": "",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get join url"
      }
    },
    "/api/v1/lms/live-classes/{classId}/leave": {
      "post": {
        "operationId": "LiveClassResource_recordLeave",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Record leave"
      }
    },
    "/api/v1/lms/live-classes/{classId}/participants/count": {
      "get": {
        "operationId": "LiveClassResource_getLiveParticipantCount",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Get live participant count"
      }
    },
    "/api/v1/lms/live-classes/{classId}/start": {
      "post": {
        "operationId": "LiveClassResource_startClass",
        "parameters": [
          {
            "in": "path",
            "name": "classId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Live classes"
        ],
        "summary": "Start class"
      }
    },
    "/api/v1/lms/mentees/{menteeId}/class-attendance": {
      "get": {
        "operationId": "MenteeProgressResource_getMenteeClassAttendance",
        "parameters": [
          {
            "in": "path",
            "name": "menteeId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "mentorId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Mentee progress"
        ],
        "summary": "Get mentee class attendance"
      }
    },
    "/api/v1/lms/mentees/{menteeId}/progress": {
      "get": {
        "operationId": "MenteeProgressResource_getMenteeProgress",
        "parameters": [
          {
            "in": "path",
            "name": "menteeId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "mentorId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Mentee progress"
        ],
        "summary": "Get mentee progress"
      }
    },
    "/api/v1/lms/mentees/{menteeId}/quiz-results": {
      "get": {
        "operationId": "MenteeProgressResource_getMenteeQuizResults",
        "parameters": [
          {
            "in": "path",
            "name": "menteeId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "mentorId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Mentee progress"
        ],
        "summary": "Get mentee quiz results"
      }
    },
    "/api/v1/lms/modules": {
      "post": {
        "operationId": "ModuleResource_createModule",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateModuleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Modules"
        ],
        "summary": "Create module"
      }
    },
    "/api/v1/lms/modules/course/{courseId}": {
      "get": {
        "operationId": "ModuleResource_modulesByCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Modules"
        ],
        "summary": "Modules by course"
      }
    },
    "/api/v1/lms/quizzes": {
      "post": {
        "operationId": "QuizResource_createQuiz",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsQuiz"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Create quiz"
      }
    },
    "/api/v1/lms/quizzes/attempts/{attemptId}/submit": {
      "post": {
        "operationId": "QuizResource_submitAttempt",
        "parameters": [
          {
            "in": "path",
            "name": "attemptId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Submit attempt"
      }
    },
    "/api/v1/lms/quizzes/course/{courseId}": {
      "get": {
        "operationId": "QuizResource_getQuizzesByCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get quizzes by course"
      }
    },
    "/api/v1/lms/quizzes/mentor/{mentorId}": {
      "get": {
        "operationId": "QuizResource_getQuizzesByMentor",
        "parameters": [
          {
            "in": "path",
            "name": "mentorId",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get quizzes by mentor"
      }
    },
    "/api/v1/lms/quizzes/my-quizzes": {
      "get": {
        "operationId": "QuizResource_getParticipantQuizzes",
        "parameters": [
          {
            "in": "query",
            "name": "participantId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get participant quizzes"
      }
    },
    "/api/v1/lms/quizzes/questions/{questionId}": {
      "delete": {
        "operationId": "QuizResource_deleteQuestion",
        "parameters": [
          {
            "in": "path",
            "name": "questionId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Delete question"
      }
    },
    "/api/v1/lms/quizzes/xp-leaderboard": {
      "get": {
        "operationId": "QuizResource_xpLeaderboard",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 50,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Xp leaderboard"
      }
    },
    "/api/v1/lms/quizzes/{quizId}": {
      "delete": {
        "operationId": "QuizResource_deleteQuiz",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Delete quiz"
      },
      "get": {
        "operationId": "QuizResource_getQuiz",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get quiz"
      },
      "put": {
        "operationId": "QuizResource_updateQuiz",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsQuiz"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Update quiz"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/assign": {
      "post": {
        "operationId": "QuizResource_assignQuiz",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {},
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Assign quiz"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/assignments": {
      "get": {
        "operationId": "QuizResource_getQuizAssignments",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get quiz assignments"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/leaderboard": {
      "get": {
        "operationId": "QuizResource_getLeaderboard",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 20,
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get leaderboard"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/my-attempts": {
      "get": {
        "operationId": "QuizResource_myAttempts",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "participantId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "My attempts"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/publish": {
      "put": {
        "operationId": "QuizResource_publishQuiz",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "boolean"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Publish quiz"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/questions": {
      "get": {
        "operationId": "QuizResource_getQuestions",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get questions"
      },
      "post": {
        "operationId": "QuizResource_addQuestion",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LmsQuizQuestion"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Add question"
      },
      "put": {
        "operationId": "QuizResource_replaceQuestions",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuestionSetRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Replace questions"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/results": {
      "get": {
        "operationId": "QuizResource_getQuizResults",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "mentorId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Get quiz results"
      }
    },
    "/api/v1/lms/quizzes/{quizId}/start": {
      "post": {
        "operationId": "QuizResource_startAttempt",
        "parameters": [
          {
            "in": "path",
            "name": "quizId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Quizzes"
        ],
        "summary": "Start attempt"
      }
    },
    "/api/v1/lms/recordings/course/{courseId}": {
      "get": {
        "operationId": "RecordingResource_byCourse",
        "parameters": [
          {
            "in": "path",
            "name": "courseId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Recordings"
        ],
        "summary": "By course"
      }
    },
    "/api/v1/lms/recordings/{recordingId}/stream": {
      "get": {
        "operationId": "RecordingResource_stream",
        "parameters": [
          {
            "in": "path",
            "name": "recordingId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "token",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Range",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Recordings"
        ],
        "summary": "Stream a class recording",
        "security": [
          {
            "stream-token": []
          }
        ],
        "description": "Authorised by the `token` query parameter, minted by `RecordingResource_streamToken`. Supports HTTP Range requests."
      }
    },
    "/api/v1/lms/recordings/{recordingId}/stream-token": {
      "get": {
        "operationId": "RecordingResource_streamToken",
        "parameters": [
          {
            "in": "path",
            "name": "recordingId",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/UUID"
            }
          },
          {
            "in": "query",
            "name": "userId",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "tags": [
          "Recordings"
        ],
        "summary": "Mint a stream token for a class recording"
      }
    }
  },
  "security": [
    {
      "keycloak-bearer": []
    }
  ],
  "tags": [
    {
      "name": "Assignments",
      "description": "Assignments, submissions and peer reviews."
    },
    {
      "name": "Certificates",
      "description": "Certificate eligibility, issuing, download and public verification. The lifecycle redesign in .kiro/specs/certificate-lifecycle is planned and not reflected here."
    },
    {
      "name": "Certificate templates",
      "description": "Templates used when a certificate is rendered."
    },
    {
      "name": "Courses",
      "description": "Courses and enrolment."
    },
    {
      "name": "Dashboard",
      "description": "Learning dashboard statistics."
    },
    {
      "name": "Egress webhook",
      "description": "Server-to-server callback from the LiveKit server about class recordings."
    },
    {
      "name": "Forum",
      "description": "Discussion threads, replies, upvotes and accepted answers."
    },
    {
      "name": "Lessons",
      "description": "Lessons, video upload, progress and token-authorised video streaming."
    },
    {
      "name": "Live classes",
      "description": "Scheduling, joining and recording live classes."
    },
    {
      "name": "Mentee progress",
      "description": "A mentee's progress, class attendance and quiz results."
    },
    {
      "name": "Modules",
      "description": "Course modules."
    },
    {
      "name": "Quizzes",
      "description": "Quizzes, questions, attempts and results."
    },
    {
      "name": "Recordings",
      "description": "Class recordings and token-authorised streaming."
    }
  ]
}
